Omet navegació

13.- Sensors(I): Monitorització Temperatura del NTC

Ja havien vist com estimar la temperatura d'un NTC amb el mètode de de Stein-Hart Hart i havien vist un programa que calculava la temperatura en ºC i en ºK, anem a veure com monitoritzar la temperatura de forma gràfica amb Processing.

L'esquema del muntatge a fer amb la targeta Arduino és el mateix que havien vist en la secció 7.2 i 7.3 d'Arduino.

Esquema NTC per Arduino / Processing

El programa que anem a utilitzar és ara aquest:

// Copyright (C) 2010 MODAT7
// Modificat el 15-04-2013 per Carles Ferrando
// License: GNU GPL ( http://www.gnu.org/licenses/gpl.html )
// En aquest programa llegirem el valor d'un NTC i estimarem el seu valor en graus centígrads
// amb el mètode de Steinhart–Hart per després mostrar els valors de la TºC i TºK de forma
// gràfica utilitzant Processing
//
//importem les llibreries de comunicació per port serie
//i la firmata d'arduino per arduino
import processing.serial.*;
import cc.arduino.*;
 
//Clase arduino que representa la targeta Arduino
Arduino arduino;

//Definició de coeficients i constants
float Ventrada=5.0;  // [V] Tensió d'entrada al divisor de tensió
float Rauxiliar=10000; // [ohm] Resistència secundaria al divisor de tensió.
float R0=10000;  // [ohm] Valor de NTC nominal a 25ºC
float T0=298.15; // [K] (25ºC) Valor en ºK de 25ºC
float beta=3891; // [K] Paràmetre B
float Rinfinit=0.0214906446; // [ohm] Paràmetre Rinfinit

//Definició de variables
float Veixida=0.0; // [V] Tensió donada pel divisor de tensió
float RNTC=0.0; // [ohm] Resistència del NTC
float TempK=0.0;// [K] Temperatura d'eixida en Kelvin
float TempC=0.0;// [ºC] Temperatura d'eixida en Celsius
int pinNTC = 3; // selecciona el pin d'entrada per al sensor de calor
int LecturaNTC=0 ;// El valor analògic llegit pel sensor al pin NTC
float y=0; //coordenada y de la temperatura ºC 
float x=0;//coordenada x de la temperatura ºC
float z=0; //coordenada y de la temperatura en ºK 
float y0=0;// valor inicial de T(C) en coordenades gràfiques 
float x0=0;// valor inicial de x0 en coordenades gràfiques
float z0=0; //valor inicial de T(K) en coordenades gràfiques 

// Configuració de paràmetres i ports d'entrada i eixida
void setup() {

  size(500, 500);//Mida pantalla
  background(255);//Pantalla blanca
 
  //L'objecte arduino cal crear-lo en primer lloc abans de llegir altre cap port
  arduino = new Arduino(this, Arduino.list()[0], 57600);
 
  //una vegada creat ja puc llegir altres ports (pins)  
  arduino.pinMode(LecturaNTC, Arduino.INPUT); 
 
}

//Programa principal al bucle
void draw()
{ 
  x0=x;//valor de x inicial o anterior al punt actual
  y0=y;//valor de y inicial o anterior al punt actual
  z0=z;//valor de z inicial o anterior al punt actual
  int LecturaNTC =  arduino.analogRead(pinNTC); //llegeix valors analògics des del sensor posat al port
  Veixida=Ventrada*((LecturaNTC)/1024.0); //Càlcul del valor de voltatge del NTC ara
  RNTC=(Rauxiliar*Veixida/(Ventrada-Veixida)); //Càlcul del valor la Resistència del NTC ara 
  TempK=(beta/log(RNTC/Rinfinit));   //Càlcul de la temperatura estimada de SteinHart-Hart en Kelvins
  TempC=TempK-273.15;   //Càlcul de la temperatura estimada en Centígrads
  println ("T (C)=" + TempC ); //Imprimeix al terminal T en C
  println ("T (K)=" + TempK ); //Imprimeix al terminal T en K
  delay(500);//aturem el programa 500 ms i després fem una lectura
 
  x=x+1;//coordenada x relativa
  y =100-TempC; //coordenada y, canviem l'origen de y al fer interpolaciló lineal
  z =200-(TempK-373);//coordenada y, canviem l'origen de y al fer interpolació lineal
  
  if (x>=500){//controlem si estem al final de la gràfica
  x=0; //en arribar el temps al final de la gràfica tornem x=0
  background(255); // Netegem la pantalla pintant el fons de blanc
  }
  
  //Gràfica en Centigrads
  strokeWeight(3);//Gruix 3 pixels
  stroke(255,0,0);//color roig
  line(0,50,500,50);//línia de 50 C
  stroke(0,0,255);//color blau
  line(0,100,500,100);//línia de 0 C
  textSize(15); // //Mida lletra
  fill(255,0,0);//color roig lletra
  text("50 ºC", 0, 48); //Retol 50ºC
  fill(0,0,255);//color blau lletra
  text("0 ºC", 0, 115); //Retol 0 ºC
  fill(148,197,240);//color blau clar
  text("Temperatura ambient en ºC",150,48);
  stroke(148,197,240);//color blau clar
  if (x>2){//fins que no hi ha dos punts no tenim recta que representar
  line(x0,y0,x,y);//Línia de temp actual ºC
  }
  //Gràfica en Kelvins
  stroke(255,0,0);//color roig
  line(0,200,500,200);//línia de 373 K
  stroke(0,0,255);//color blau
  line(0,300,500,300);//línia de 273 K
  textSize(15); // //Mida lletra
  fill(255,0,0);//color roig lletra
  text("373 ºK", 0, 195); //Retol 373 ºK
  fill(0,0,255);//color blau lletra
  text("273 ºK", 0, 315); //Retol 273 ºK
  fill(148,197,240);//color blau clar
  text("Temperatura ambient en ºK",150,188);
  stroke(84,71,175);//color lila
  if (x>2){//fins que no hi ha dos punts no tenim recta que representar
  line(x0,z0,x,z);//Línia de temp actual ºK 
  }
 
 
}

La gràfica que veuràs és aquesta:

Gràfica de temperatura feta per Processing llegint Arduino

En aquesta gràfica veus un escaló produït per l'engegada d'un assecador de cabells.

Cal aclarir el canvi d'origen per la coordenada «y» tant per la temperatura en ºC com en ºK doncs si no fem aquest canvi la gràfica de processing té l'origen al cantó superior esquerre i el volem a la vora esquerra però al costat de la ratlla blava que marca la temperatura de 0 ºC i 273 ºK respectivament.

Els canvis fets han estat aquests:

Interpolació per al graus Celsius

 

 Interpolació per al graus Kelvin